package net.jcip.chapter4;

import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseListener;
import java.util.*;
import java.util.concurrent.*;

/**
 * Delegating thread safety to multiple underlying state variables
 *
 * 由于各个状态之间不存在耦合关系，因此VisualComponent可以将它的线程安全性委托给 mouseListeners和 keyListeners等对象。
 * @author Brian Goetz and Tim Peierls
 */
public class VisualComponent {

    /**
     * 让 线程 安全的 CopyOnWriteArrayList 对属性进行托管,  这样 就算 本类  没有加上锁, 也能达成 线程 安全的效果;
     * */
    private final List<KeyListener> keyListeners = new CopyOnWriteArrayList< >();

    private final List<MouseListener> mouseListeners = new CopyOnWriteArrayList< >();

    public void addKeyListener(KeyListener listener) {
        keyListeners.add(listener);
    }

    public void addMouseListener(MouseListener listener) {
        mouseListeners.add(listener);
    }

    public void removeKeyListener(KeyListener listener) {
        keyListeners.remove(listener);
    }

    public void removeMouseListener(MouseListener listener) {
        mouseListeners.remove(listener);
    }
}
